<?php
include_once "filtro_cabecera.php";
include_once "../funciones/funciones_php.php";
include_once "capa_datos.php";
include_once "../funciones/modeloBase.php";

function marcarBultosConMaster($arrayOrdenes, $idMasterEncomienda, $tipoBulto)
{
   
   for($i = 0; $i < count($arrayOrdenes) ; $i++)
   {
      if($arrayOrdenes[$i]['id_tipo_encomienda'] == $tipoBulto && $arrayOrdenes[$i]['id_orden_flete'] != 0)
      {
         marcarBultoConMaster($idMasterEncomienda, $arrayOrdenes[$i]['id_orden_flete'], $tipoBulto );
      }
     
   }
   
   return true;
}

//calucula la cantidad de un tipo de bulto correspondiente a la orden que estan agregados
function contarBultosOrden($numOrden, $bulto, $arrayOrdenes)
{
   $count = 0;
   
   for($i = 0; $i < count($arrayOrdenes) ; $i++)
   {
      if($arrayOrdenes[$i]['id_orden_flete'] == $numOrden)
      {
         if($arrayOrdenes[$i]['id_tipo_encomienda'] == $bulto)
         {
            $count++; 
         }
      }
   }
   
   return $count;
}

//Genera un array de los bultos ingresados para la vista
function arrayOrdenesIngresadas($arrayOrdenes)
{
   $numOrden = 0;
   for($i = 0; $i < count($arrayOrdenes) ; $i++)
   {
      if($numOrden != $arrayOrdenes[$i]['id_orden_flete'] && $arrayOrdenes[$i]['id_orden_flete'] != 0 )
      {
         $numOrden = $arrayOrdenes[$i]['id_orden_flete'];
         $cajas = contarBultosOrden($numOrden, 1, $arrayOrdenes);
         $sobres = contarBultosOrden($numOrden, 2, $arrayOrdenes);
         $valijas = contarBultosOrden($numOrden, 3, $arrayOrdenes);
         $arrayVista[] = array('id_orden_flete' => $numOrden,'origen' => $arrayOrdenes[$i]['origen'],'comuna_origen'=>$arrayOrdenes[$i]['comuna_origen'],
                             'destino' => $arrayOrdenes[$i]['destino'],'comuna_destino' => $arrayOrdenes[$i]['comuna'], 'cajas' => $cajas, 'sobres' => $sobres,
                             'valijas' => $valijas);
      }
   }
   
   return $arrayVista;
}

//valida que todos los destinos y origenes sean iguales a los indicados en el master
function validaIgualdadDeDestinos($arrayOrdenes, $idComunaOrigen, $idComunaDestino)
{
   $idOrigenMaster = getDestinoDeComuna($idComunaOrigen);
   $idDestinoMaster = getDestinoDeComuna($idComunaDestino);
   
   for($i = 0 ; $i < count($arrayOrdenes); $i++)
   {
      if($arrayOrdenes[$i]['id_orden_flete'] != 0)
      {
         $idOrigenOrden = $arrayOrdenes[$i]['id_origen'];
         $idDestinoOrden = $arrayOrdenes[$i]['id_destino'];
         
         //compara el primer destino con el actual
         if($idOrigenOrden != $idOrigenMaster['id_destino'] || $idDestinoOrden != $idDestinoMaster['id_destino'])
         {
            return false;
         }  
      }
   }
   
   return true;  
}


//Valida si el bulto que se quieren agregar cuadra con lo especificado en la master
function compruebaCuadraturaBultos($fila, $bultosMaster, $idTipoEncomienda)
{
   
   $countBultos = 0;

   for($i = 0 ; $i < count($fila) ; $i++)
   {
      
      //Si tiene cajas
      if($fila[$i]['id_tipo_encomienda'] == $idTipoEncomienda)
      {
          //Comprueba el total de cajas agregadas hasta el momento
         $difBultosAgregadas = $bultosMaster - $countBultos;
         
         if($difBultosAgregadas > 0)
         {
            //$_SESSION['aux']['caja']++;
            $arrayDetalleBultos[] = $fila[$i];
            $countBultos++;
         }
         else
         {
            return false;
         }
                  
      }
      
   }
   
   return $arrayDetalleBultos;
        
}

//Valida si el array esta vacio
function arrayVacio($array)
{
   $count = 0;
   
   for($i = 0; $i < count($array) ; $i++)
   {
      if($array[$i]['id_orden_flete'] != 0)
      {
         $count++;
      }
   }
   
   if($count > 0)
   {
      return false;
   }
   
   return true;
}

//Valida si existe el elemento en el array
function arrayExisteOrden($numOrden, $array)
{
   
   for($i = 0; $i < count($array) ; $i++)
   {
      if($array[$i]['id_orden_flete'] != 0 && $array[$i]['id_orden_flete'] == $numOrden)
      {
         return true;
      }
   }
   
   return false;
    
}

//Genera la vista
function ver($msj = "")
{  
  if(isset($_SESSION['form_master']))
  {
   
     require_once "menu_operacion.php"; //muestra el menu para el cliente
     require_once 'ingresar_orden_master_view.php'; //Muestra formulario para ingresar mas ordenes
     //Imprime grid con ordenes ingresadas
     if(isset($_SESSION['encomiendasMaster']) && !arrayVacio($_SESSION['encomiendasMaster']))
     {
        require_once 'tabla_detalle_encomienda_master_view.php';
     }
  }
  else
  {
     header("location:crear_master_carga.php");
  }
}

//Recibe variables del fomurlario de datos
if(isset($_POST['Continuar'])) 
{
   require_once "menu_operacion.php";
   
   while(list($clave, $valor) = each($_POST))
   {
      $_SESSION['form_master'][$clave] = strtoupper(trim($valor));
   }
   
   //Crea variables para contar
   if(!isset($_SESSION['aux']))
   {
      $_SESSION['aux']['caja'] =  0;
      $_SESSION['aux']['sobre'] = 0;
      $_SESSION['aux']['valija'] = 0;
   } 
   
   //VALIDACION DE CAMPOS
    $f = $_SESSION['form_master'];
   
   if(!validaFecha($f['fecha']) || empty($f['fecha']))
   {
      die(phpAlertDialog("El formato de fecha ingresado no es correcto", "ERROR", "crear_master_carga.php"));;
   }
   
   if(!validaInt($f['numero_orden']) || empty($f['numero_orden']))
   {
      die(phpAlertDialog("numero de orden debe ser numero entero", "ERROR", "crear_master_carga.php"));
   }
   
   if(!valida_rut($f['rut_proveedor']) || empty($f['rut_proveedor']))
   {
      die(phpAlertDialog("rut de proveedor no es valido", "ERROR", "crear_master_carga.php"));
   }
   
   if(!validaAlfanumerico($f['nombre_proveedor'],"esp;ace;num;ene") || empty($f['nombre_proveedor']))
   {
      die(phpAlertDialog("Existen caracteres no permitidos en el nombre del proveedor", "ERROR", "crear_master_carga.php"));
   }
   
   
   if(!validaAlfanumerico($f['nombre_consignatario'], "esp;ace;num;ene") || empty($f['nombre_consignatario']))
   {
      die(phpAlertDialog("El nombre de consignatario posee caracteres no permitidos", "ERROR", "crear_master_carga.php"));
   }
   
    
   if(!validaAlfanumerico($f['direccion_consignatario'], "esp;ace;num;ene") || empty($f['direccion_consignatario']) )
   {
      die(phpAlertDialog("La Direccion de consignatario posee caracteres no permitidos ", "ERROR", "crear_master_carga.php"));
   }
   
   if(!validaDigito($f['numero_direccion_consignatario']) || empty($f['numero_direccion_consignatario']))
   {
      die(phpAlertDialog("El numero de direccion posee caracteres no permitidos", "ERROR", "crear_master_carga.php"));
   }
  
     
   
   
   if($f['caja'] > 0)
   {
      if(!validaInt($f['caja']) || empty($f['caja'] ))
      {
         die(phpAlertDialog("Cantidad de cajas debe ser numero entero", "ERROR", "crear_master_carga.php"));
      }
      
      if(!validaFloat($f['peso_caja']) || empty($f['peso_caja']) || $f['peso_caja'] <= 0)
      {
         die(phpAlertDialog("Peso de cajas debe ser un numero entero", "ERROR", "crear_master_carga.php"));
      }
   
      if(!validaFloat($f['largo_caja']) || empty($f['largo_caja']) || $f['largo_caja'] <= 0)
      {
         die(phpAlertDialog("Largo de cajas debe ser un numero entero", "ERROR", "crear_master_carga.php"));
      }
   
      if(!validaFloat($f['ancho_caja']) || empty($f['ancho_caja']) || $f['ancho_caja'] <= 0)
      {
         die(phpAlertDialog("Ancho de cajas debe ser un numero entero", "ERROR", "crear_master_carga.php"));
      }
   
      if(!validaFloat($f['alto_caja']) || empty($f['alto_caja']) || $f['alto_caja'] <= 0)
      {
         die(phpAlertDialog("Alto de cajas debe ser un numero entero", "ERROR", "crear_master_carga.php"));
      }
   }
   else
   {
      $_SESSION['form_master']['caja'] = 0;
      $_SESSION['form_master']['peso_caja'] = 0;
      $_SESSION['form_master']['largo_caja'] = 0;
      $_SESSION['form_master']['ancho_caja'] = 0;
      $_SESSION['form_master']['alto_caja'] = 0;
   }
   
   if($f['valija'] > 0)
   {
      if(!validaInt($f['valija']) || empty($f['valija'] ))
      {
         die(phpAlertDialog("Cantidad de valijas debe ser numero entero", "ERROR", "crear_master_carga.php"));
      }
      
      if(!validaFloat($f['peso_valija']) || empty($f['peso_valija']) || $f['peso_valija'] <= 0)
      {
         die(phpAlertDialog("Peso de valijas debe ser un numero entero", "ERROR", "crear_master_carga.php"));
      }
   
  
   }
   else
   {
      $_SESSION['form_master']['valija'] = 0;
      $_SESSION['form_master']['peso_valija'] = 0;
    
   }
   
   
   if($f['sobre'] > 0)
   {
      if( !validaInt($f['sobre']) || empty($f['sobre']))
         die(phpAlertDialog("Cantidad de sobres debe ser un numero entero", "ERROR", "crear_master_carga.php"));
   }
   else
   {
      $_SESSION['form_master']['sobre'] = 0;  
   }
   
   //valida que no sean las 3 tipos de encomienda igual a cero
   if($_SESSION['form_master']['caja'] == 0 && $_SESSION['form_master']['valija'] == 0 && $_SESSION['form_master']['sobre'] == 0 )
   {
      die(phpAlertDialog('No ha ingresado cantidades', 'Error', 'crear_master_carga.php'));
   }
   
   if(!validaInt($f['flete']) || empty($f['flete']) || $f['flete'] <= 0)
   {
      die(phpAlertDialog("Valor de flete ser un numero entero y mayor a cero", "ERROR", "crear_master_carga.php"));
   }
   
   if($f['seguro'] > 0)
   {
      if(!validaInt($f['seguro']) || empty($f['seguro']) || $f['seguro'] < 0)
         die(phpAlertDialog("Valor de seguro debe ser un numero entero", "ERROR", "crear_master_carga.php"));
   }
   else
   {
      $_SESSION['form_master']['seguro'] = 0;
   }
   
   if($f['manejo'] > 0)
   {
      if(!validaInt($f['manejo']) || empty($f['manejo']) || $f['manejo'] < 0)
         die(phpAlertDialog("Valor de manejo debe ser un numero entero", "ERROR", "crear_master_carga.php"));
   }
   else
   {
      $_SESSION['form_master']['manejo'] = 0;
   }
   
   
   if($f['otros'] > 0)
   {
      if(!validaInt($f['otros']) || empty($f['otros']) || $f['otros'] < 0)
         die(phpAlertDialog("Valor de otros debe ser un numero entero", "ERROR", "crear_master_carga.php"));
   }
   else
   {
      $_SESSION['form_master']['otros'] = 0;
   }
   
   if($f['descuento'] > 0)
   {
      if(!validaFloat($f['descuento']) || empty($f['descuento']) || $f['descuento'] < 0)
         die(phpAlertDialog("Valor de descuento debe ser un numero entero", "ERROR", "crear_master_carga.php"));
   }
   else
   {
      $_SESSION['form_master']['descuento'] = 0;
   }
   
   
   if(!validaInt($f['total']) || empty($f['total']) || $f['total'] <= 0)
   {
      die(phpAlertDialog(" Total debe ser un numero entero y mayor a cero", "ERROR", "crear_master_carga.php"));
   }
   
   ver();
}
elseif(isset($_POST['Agregar'])) //accion para buscar los bultos de la orden
{ 
   //Si ha ingresdo los datos del master
   if(isset($_SESSION['form_master']))
   {
      $conexion = conectar();
      $idOrden = trim($_POST['idOrden']);
   
      //Consulta en la BD si existe alguna orden con ese numero
      // !array_search($idOrden, $_SESSION['ordenesMaster'], true)
      $countCajas = 0;
   
      //Compureba que exista la orden y que tenga  bultos que no esten asociados a otra master
      if( existeBultoEnMaster($idOrden) && !arrayExisteOrden($idOrden, $_SESSION['encomiendasMaster']) )
      {
         
         //obtiene id del proveedor ingresado
         $idProveedor = $_SESSION['form_master']['id_proveedor'];
         
         //obtiene id del destino de la comuna ingresada
         $destino = getDestinoDeComuna($_SESSION['form_master']['id_comuna_destino']);
         $idDestino = $destino['id_destino'];
         //obtiene el id origen
         $origen = getDestinoDeComuna($_SESSION['form_master']['id_comuna_origen']);
         $idOrigen = $origen['id_destino'];
         
         //obtiene un array con todas las encomiendas
         $fila = getEncomiendasOrden($idOrden, $idOrigen, $idDestino, $idProveedor);
         
         //si fila es verdadero (si obtuvo un array con los bultos de la orden)
         if($fila)
         {
            //si el master tiene cajas, verifica si el numero de bultos de la orden que van por este proveedor a este destino cuadra con el de la master
            if($_SESSION['form_master']['caja'] > 0)
            {
               //Si cuadran las cajas con la master las ingresa
               if($arrayCajasOrden = compruebaCuadraturaBultos($fila, $_SESSION['form_master']['caja'] - $_SESSION['aux']['caja'], 1))
               {
                  //cuenta cajas, sobres y valijas
                  for($i = 0 ; $i < count($arrayCajasOrden) ; $i++)
                  {
                     $_SESSION['encomiendasMaster'][] = $arrayCajasOrden[$i];
                     $_SESSION['aux']['caja']++;//contador de cajas agregadas
                     
                  }
                  
               }
               else
               {
                  $mje = "<br />El numero de cajas de esta orden no cuadra con el de las master";
               }
            }
            
            //si el master tiene sobres, verifica si el numero de bultos de la orden que van por este proveedor a este destino cuadra con el de la master
            if($_SESSION['form_master']['sobre'] > 0)
            {
               //Si cuadran los sobres con los especificados en el master los ingresa
               if($arraySobresOrden = compruebaCuadraturaBultos($fila, $_SESSION['form_master']['sobre'] - $_SESSION['aux']['sobre'], 2))
               {
                   //agrega los sobres de la orden al master
                  for($i = 0 ; $i < count($arraySobresOrden) ; $i++)
                  {
                     $_SESSION['encomiendasMaster'][] = $arraySobresOrden[$i];
                     $_SESSION['aux']['sobre']++;  //contador de sobres agregados 
                  }
                  
               }
               else
               {
                  $mje .= "<br />El numero de sobres no cuadra con los especificados en el master";
               }
            }
            
            //si el master tiene valijas, verifica si el numero de bultos de la orden que van por este proveedor a este destino cuadra con el de la master
            if($_SESSION['form_master']['valija'] > 0)
            {
               //Si cuadran las valijas con los especificados en el master los ingresa
               if($arrayValijasOrden = compruebaCuadraturaBultos($fila, $_SESSION['form_master']['valija'] - $_SESSION['aux']['valija'], 3))
               {
                   //agrega las valijas de la orden al master
                  for($i = 0 ; $i < count($arrayValijasOrden) ; $i++)
                  {
                        $_SESSION['encomiendasMaster'][] = $arrayValijasOrden[$i];
                        $_SESSION['aux']['valija']++;  //contador de valijas agregadas 
                  }
                  
               }
               else
               {
                  $mje .= "<br />El numero de valijas no cuadra con los especificados en el master";
               }
            }
            
            //Genera la vista
            ver($mje);

            //require_once "menu_operacion.php"; //muestra el menu para el cliente
            //require_once 'ingresar_orden_master_view.php'; //Muestra formulario para ingresar mas ordenes
            //require_once 'tabla_detalle_encomienda_master_view.php';
            //echo $mje;
         }
         else
         {
            //genera la vista
            //require_once "menu_operacion.php"; //muestra el menu para el cliente
            //require_once 'ingresar_orden_master_view.php'; //Muestra formulario para ingresar mas ordenes
         
            $mje = "<br />No se encontraron bultos en esta orden, que se puedan vincular con el master";
            ver($mje);
         }   
      }
      else
      {
         $msj = "<br />Orden " . $idOrden . ", no existe en la Base de datos o se encuentra asociada a otro Master o sus bultos ya se encuentran ingresados actualmente";
         //Muestra formulario de ingreso
         ver($msj);
         
      }
   }
   else //Redirecciona, si es que no ha ingresado los datos del master
   {
         header("location:crear_master_carga.php");
   }
   
   pg_close($conexion);
  
}
elseif(isset($_POST['Eliminar'])) //Accion para eliminar una orden
{
   $post = $_POST['Eliminar'];
   
   list($indice , $numOrden) = explode("|", $post);
   
   $cajas = contarBultosOrden($numOrden, 1, $_SESSION['encomiendasMaster']);
   $sobres = contarBultosOrden($numOrden, 2, $_SESSION['encomiendasMaster']);
   $valijas = contarBultosOrden($numOrden, 3, $_SESSION['encomiendasMaster']);
   $_SESSION['aux']['caja'] = $_SESSION['aux']['caja'] - $cajas; 
   $_SESSION['aux']['sobre'] = $_SESSION['aux']['sobre'] - $sobres; 
   $_SESSION['aux']['valija'] = $_SESSION['aux']['valija'] - $valijas; 
   
   //pone en cero todos los elementos que tengan el numero de orden de flete seleccionado
   for($i = 0 ; $i < count($_SESSION['encomiendasMaster']) ; $i++)
   {
      if($_SESSION['encomiendasMaster'][$i]['id_orden_flete'] == $numOrden)
      {
         $_SESSION['encomiendasMaster'][$i]['id_orden_flete'] = 0;
      }
   }
   
   
   
   //$_SESSION['encomiendasMaster'][$indice] = 0;
   
   $msj =  "Bultos de la Orden " . $numOrden  . " han sido eliminados";
   ver($msj);
   
   
}
elseif(isset($_POST['Atras'])) //Accion para volver al formulario de master
{
   //unset($_SESSION['encomiendasMaster']);
   header("Location: crear_master_carga.php");
   
}
elseif(isset($_POST['Cancelar'])) //Cancela la master y elimina las sessiones
{
   unset($_SESSION['form_master']);
   unset($_SESSION['encomiendasMaster']);
   unset($_SESSION['aux']);
   header('location: crear_master_carga.php');
}
elseif(isset($_POST['Finalizar'])) //Accion finalizar
{
      //Muestra menu principal
      require_once("menu_operacion.php"); 
      
      //conecta con la BD
      $conexion = conectar();
     
      
      $totalCaja = $_SESSION['form_master']['caja'] - $_SESSION['aux']['caja'];
      $totalSobre = $_SESSION['form_master']['sobre'] - $_SESSION['aux']['sobre'];
      $totalValija = $_SESSION['form_master']['valija'] - $_SESSION['aux']['valija'];
      
      if(arrayVacio($_SESSION['encomiendasMaster'])==FALSE && $totalCaja == 0 && $totalSobre == 0 && $totalValija == 0 && validaIgualdadDeDestinos($_SESSION['encomiendasMaster'], $_SESSION['form_master']['id_comuna_origen'], $_SESSION['form_master']['id_comuna_destino'] )==TRUE)
      {
         //Comienza la transaccion
         pg_query("BEGIN")or die(phpAlertDialog("Error al iniciar la transaccion", "Error", "crear_master_carga.php"));
      
         //Ingresa la master a la BD y obtiene su ID
         $idMaster = ingresarMaster($_SESSION['form_master']);
      
         //Si tiene cajas las ingresa
         if($_SESSION['form_master']['caja'] > 0)
         {
            $volumen_caja = redondearDosDecimal(($_SESSION['form_master']['largo_caja'] * $_SESSION['form_master']['ancho_caja'] * $_SESSION['form_master']['alto_caja']) / 4000); 
            $idMasterEncomiendaCaja = ingresarBultoMaster($idMaster, 1, $_SESSION['form_master']['caja'], $_SESSION['form_master']['peso_caja'], $volumen_caja   );
            //Marca todas las ordenes con la master
            marcarBultosConMaster($_SESSION['encomiendasMaster'], $idMasterEncomiendaCaja, 1)or die(phpAlertDialog("Ocurrio un error en el proceso de ingreso de la master #329", "ERROR", "crear_master_carga.php"));
         
         }
      
         //Si tiene sobres los ingresa
         if($_SESSION['form_master']['sobre'] > 0)
         {
            $idMasterEncomiendaSobre = ingresarBultoMaster($idMaster, 2, $_SESSION['form_master']['sobre']);
            marcarBultosConMaster($_SESSION['encomiendasMaster'], $idMasterEncomiendaSobre, 2)or die(phpAlertDialog("Ocurrio un error en el proceso de ingreso de la master #329", "ERROR", "crear_master_carga.php"));
         
         }
      
         //Si tiene valijas las ingresa
         if($_SESSION['form_master']['valija'] > 0)
         {
            $idMasterEncomiendaValija = ingresarBultoMaster($idMaster, 3, $_SESSION['form_master']['valija'], $_SESSION['form_master']['peso_valija'] );
            marcarBultosConMaster($_SESSION['encomiendasMaster'], $idMasterEncomiendaValija, 3)or die(phpAlertDialog("Ocurrio un error en el proceso de ingreso de la master #329", "ERROR", "crear_master_carga.php"));
         }
         
         
         //Envia la transaccion
         if(pg_query("COMMIT"))
         {
            unset($_SESSION['encomiendasMaster']);
            unset($_SESSION['form_master']);
            unset($_SESSION['aux']);
            phpAlertDialog("Master ingresado correctamente", "Atencion", "crear_master_carga.php");
         }
         else
         {
            phpAlertDialog("Ocurrio un error en el proceso de ingreso de la master #340", "ERROR", "crear_master_carga.php");
         }
      
      }
      else
      {
         phpAlertDialog('No se puede ingresar la master debido a uno de los siguientes motivos: <br/>-No ha ingresado Ordenes<br />-Las ordenes ingresadas no cuadran con el master<br />-Los destinos no coinciden', 'Error', 'proceso_master_carga.php');
      }
      

}
else //Accion por defecto
{
   if(isset($_SESSION['form_master']) && isset($_SESSION['ordenesMaster']))
   {
      ver();    
   }
   else
   {
      header("location: crear_master_carga.php");
    
   }
}

